package com.ggy.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.beanutils.ConvertUtils;

/**
 * @description TODO 将结果集ResultSet映射成javaBean(前提是JavaBean中的属性名称和数据库中的字段名称一样
 * @author Michael
 * @createTime 2017年7月31日 上午1:15:52
 * 
 */
public class ColumnMapping {
	@SuppressWarnings("unchecked")
	public static List<Object> columnMapping(ResultSet rs, Class clazz)
			throws InstantiationException, IllegalAccessException, SQLException {
		Object obj = clazz.newInstance();
		Field[] fields = clazz.getDeclaredFields();
		List<Object> _list = new ArrayList<Object>();
		while (rs.next()) {
			for (Field field : fields) {
				// 得到字段名
				String name = field.getName();
				// 默认情况下列名 等于javaBean里属性的值
				String columnName = new String(name);
				// 得到 字段类型
				Class type = field.getType();
				// 判断字段上是否有注解
				if (field.isAnnotationPresent(Column.class)) {
					// 获取字段上column注解的值，并赋值给列名
					columnName = field.getAnnotation(Column.class).value();
				}
				Method method = null;
				try {
					method = clazz.getMethod(
							"set" + name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase()), type);
					//注册时间类型转换器
					ConvertUtils.register(new DateTimeConvert(), Date.class);
					//调用Set方法为对象设置值
					method.invoke(obj, ConvertUtils.convert(rs.getString(columnName),type));
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			_list.add(obj);
		}
		return _list;
	}
	 /**
     * 测试数据库中取出的结果集是否能正常反射到javabean
     * @throws Exception
     */
    /*@Test
    public void testResultSet() throws Exception{
        Connection connection=DBUtil.getConnection();
        String str="select * from user";
        PreparedStatement preparedStatement=connection.prepareStatement(str);
        ResultSet rs=preparedStatement.executeQuery();
        List users=NewColumnToFieldMappingUtil.ColumnToField(rs, UserEntity.class);
        System.out.println(users);
    }*/
}
